package in.lib.view;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.widget.TextView;
import in.lib.utils.DateRenderer;
/**
* MPme
* User: romainpiel
* Date: 22/07/2013
* Time: 08:00
*/
public class TextChronometer extends TextView
{
private boolean isAttached;
private long time;
private DateRenderer dateRenderer;
private boolean hasSeconds;
private Handler handler;
private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver()
{
@Override public void onReceive(Context context, Intent intent)
{
onTimeChanged();
}
};
private Runnable ticker;
public TextChronometer(Context context)
{
this(context, null, 0);
}
public TextChronometer(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}
public TextChronometer(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init(context);
}
public void setTime(long timeInMillis)
{
this.time = timeInMillis;
onTimeChanged();
}
private void init(Context context)
{
dateRenderer = new DateRenderer(context);
hasSeconds = true;
handler = new Handler();
}
private void setupTicker()
{
if (hasSeconds && ticker == null)
{
ticker = new Runnable()
{
public void run()
{
onTimeChanged();
long now = SystemClock.uptimeMillis();
long next = now + (1000 - now % 1000) + 10000;
handler.postAtTime(ticker, next);
}
};
ticker.run();
}
else if (!hasSeconds && ticker != null)
{
handler.removeCallbacks(ticker);
ticker = null;
}
}
@Override protected void onAttachedToWindow()
{
super.onAttachedToWindow();
if (!isAttached)
{
isAttached = true;
registerReceiver();
onTimeChanged();
}
}
@Override protected void onDetachedFromWindow()
{
super.onDetachedFromWindow();
if (isAttached)
{
unregisterReceiver();
getHandler().removeCallbacks(ticker);
isAttached = false;
}
}
private void registerReceiver()
{
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_TICK);
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
getContext().registerReceiver(mIntentReceiver, filter, null, getHandler());
}
private void unregisterReceiver()
{
getContext().unregisterReceiver(mIntentReceiver);
}
private void onTimeChanged()
{
DateRenderer.TimeAgo timeAgo = dateRenderer.timeAgo(time);
hasSeconds = timeAgo.unit.type.equals(DateRenderer.SECONDS);
setupTicker();
setText(timeAgo.formattedDate);
}
}